﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;
using System.Data.SqlClient;
using ddcCajamarca.BusinessEntities.Directorio;
using ddcCajamarca.Repository.Directorio.Service;

namespace ddcCajamarca.Repository.Directorio
{
    public class OrganizacionRepository : MasterRepository, IOrganizacionRepository
    {
        public Organizacion GetFromOrganizacionById(int id)
        {
            var query = from p in Context.Organizaciones.Include("Ubigeo")
                            .Include("TipoOrganizacion")
                            .Include("SubTipoInstitucion")
                            .Include("Infraestructura")
                        where p.Id.Equals(id)
                        select p;

            return query.SingleOrDefault();
        }

        public int GetOrganizacionByDNI(string ruc, string opcion, int id)
        {
            try
            {
                var existe = Context.Organizaciones.Find(ruc);
                if (opcion=="Editar" && existe.Id==id)
                {
                    return 1;
                }
                else
                {
                    return 0;
                }
            }
            catch (Exception)
            {
                if (opcion == "Editar" && id>=0)
                {
                    return 1;
                }
                else
                {
                    return 0;
                }
            }
        }

        public IEnumerable<Organizacion> GetOrganizacionByCriterio(string criterio)
        {
            IEnumerable<Organizacion> query;

            if (String.IsNullOrEmpty(criterio))
            {
                query = Context.Database.SqlQuery<Organizacion>("dbo.ShowAllOrganizacionLista").ToList();
            }
            else
            {
                query = Context.Database.SqlQuery<Organizacion>("dbo.ShowOrganizacionByCriterio @criterio = '" + criterio + "'").ToList();
            }

            return query;
        }

        public IEnumerable<Organizacion> GetAllOrganizaciones()
        {
            return Context.Organizaciones;
        }

        public void AddOrganizacion(Organizacion organizacion)
        {
            var query = Context.Database.SqlQuery<Organizacion>("exec dbo.NewOrEditOrganizacion @Id = '"
                + organizacion.Id + "', @Ruc = '"
                + organizacion.Ruc + "', @Nombre = '"
                + organizacion.Nombre + "', @Direccion = '"
                + organizacion.Direccion + "', @Telefono = '"
                + organizacion.Telefono + "', @Telefono2 = '"
                + organizacion.Telefono2 + "', @Email = '"
                + organizacion.Email + "', @PaginaWeb = '"
                + organizacion.PaginaWeb + "', @Logo = '"
                + organizacion.Logo + "', @IdUbigeo = '"
                + organizacion.IdUbigeo + "', @IdTipoOrganizacion = '"
                + organizacion.IdTipoOrganizacion + "', @InstitucionVinculada = '"
                + organizacion.InstituciónVinculada + "', @IdSubTipoOrganizacion = '"
                + organizacion.IdSubTipoOrganizacion + "'").SingleOrDefault();

            organizacion.Id = query.Id;

            foreach (var detalle in organizacion.Infraestructura)
            {
                Context.Database.ExecuteSqlCommand("exec dbo.NewDetalleInfraestructura @Ambientte = '"
                    + detalle.Ambientte + "', @Butacas = '"
                    + detalle.Butacas + "', @Pie = '"
                    + detalle.Pie + "', @Graderias = '"
                    + detalle.Graderias + "', @EquiposVisuales = '"
                    + detalle.EquiposVisuales + "', @EquiposAudio = '"
                    + detalle.EquiposAudio + "', @Aforo = '"
                    + detalle.Aforo + "', @IdOrganizacion = '"
                    + organizacion.Id + "'");
            }
        }

        public void UpdateOrganizacion(Organizacion organizacion)
        {
            Context.Database.ExecuteSqlCommand("dbo.DeleteDetalleInfraestructura @idOrganizacion = '"
                + organizacion.Id + "'");

            foreach (var detalle in organizacion.Infraestructura)
            {
                Context.Database.ExecuteSqlCommand("exec dbo.NewDetalleInfraestructura @Ambientte = '"
                    + detalle.Ambientte + "', @Butacas = '"
                    + detalle.Butacas + "', @Pie = '"
                    + detalle.Pie + "', @Graderias = '"
                    + detalle.Graderias + "', @EquiposVisuales = '"
                    + detalle.EquiposVisuales + "', @EquiposAudio = '"
                    + detalle.EquiposAudio + "', @Aforo = '"
                    + detalle.Aforo + "', @IdOrganizacion = '"
                    + organizacion.Id + "'");
            }

            var query = Context.Database.SqlQuery<Organizacion>("exec dbo.NewOrEditOrganizacion @Id = '"
                + organizacion.Id + "', @Ruc = '"
                + organizacion.Ruc + "', @Nombre = '"
                + organizacion.Nombre + "', @Direccion = '"
                + organizacion.Direccion + "', @Telefono = '"
                + organizacion.Telefono + "', @Telefono2 = '"
                + organizacion.Telefono2 + "', @Email = '"
                + organizacion.Email + "', @PaginaWeb = '"
                + organizacion.PaginaWeb + "', @Logo = '"
                + organizacion.Logo + "', @IdUbigeo = '"
                + organizacion.IdUbigeo + "', @IdTipoOrganizacion = '"
                + organizacion.IdTipoOrganizacion + "', @InstitucionVinculada = '"
                + organizacion.InstituciónVinculada + "', @IdSubTipoOrganizacion = '"
                + organizacion.IdSubTipoOrganizacion + "'").SingleOrDefault();

            organizacion.Id = query.Id;
        }

        public String DeleteOrganizacion(int id)
        {
            var existe = GetFromOrganizacionById(id);

            try
            {
                if (existe != null)
                {
                    Context.Database.ExecuteSqlCommand("dbo.DeleteOrganizacion @id = '" + id + "'");
                }
                return "";
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }

        //Para obtener solo la organizacion
        public Organizacion GetOrganizacionById(int id)
        {
            return Context.Organizaciones.Find(id);
        }
    }
}
